package cn.tedu.charging.order.points;

import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
@ServerEndpoint("/ws/server/{userId}")
@Slf4j
public class WsServerPoint {

    private static Map<Integer,Session> SESSION=new ConcurrentHashMap<>();
    //这个方法的存在,允许系统可以在业务当中根据需求 调用方法发送实时消息给用户
    public void sendMsg2User(Integer userId,String msg){
        //1.通过userId 从SESSION中拿到连接会话
        Session session = SESSION.get(userId);
        //判断session非空
        if (session!=null){
            try{
                //2.消息推送
                session.getBasicRemote().sendText(msg);
            }catch (Exception e){
                log.error("推送消息失败",e);
            }
        }else{
            log.info("用户已经下线,无法获取session");
        }
        //3.消息要进行持久化 谁的消息 消息内容 消息创建时间 消息是否已读
    }
    /*
        当客户端通过 localhost:10090/ws连接这个端点的时候
        有一个客户端连接,就调用一次onOpen方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId")Integer userId){
        log.info("有客户端建立连接,客户端sessionId:{}", session.getId());
        //保存映射
        SESSION.put(userId,session);
        //建立连接,查询持久化消息 有多少条未读 反馈数字
    }

    /*
        当客户端建立了连接之后 主动断开
        调用close方法
     */
    @OnClose
    public void onClose(Session session,@PathParam("userId")Integer userId){
        log.info("客户端关闭连接,客户端sessionId:{}", session.getId());
        //删除映射
        SESSION.remove(userId);
    }

    /*
     * 当客户端通过连接 向服务端发送消息数据(纯字符串序列化 xml html json)
     * 端点会调用message方法 并且获取客户端传递的数据
     */
    @OnMessage
    public void onMessage(String message,Session session,@PathParam("userId")Integer userId){
        log.info("接收到客户端消息:{},消息来源客户端sessionId:{}",message,session.getId());
    }
    /*
        客户端连接出现异常 会调用error方法 传递异常类型
     */
    @OnError
    public void onError(Throwable throwable,Session session,@PathParam("userId")Integer userId){
        log.error("客户端连接出现异常,异常客户端sessionId:{}",throwable,session.getId());
    }
}
